# -*- coding: utf-8 -*-
import datetime
from django.db import models
from django.contrib.auth.models import User
from lr.board.models import Contest
from lr.catalogue.models import Genre



class WorkManager(models.Manager):
    """ Менеджер создания новых документов """
    
    
    def createWork(self, author, title, page_title='', genre='', text='', owner=None, fosterling=None, contest=None):
        """ Создать новое произведение """
        try:
            genre = Genre.objects.get(id=genre)
        except:
            genre = None
        
        work = Work.objects.create(author=author, owner=owner, fosterling=fosterling, signature='',
                                   date=None, genre=genre, status=u'draft', edition=1, price=0,
                                   view_price=0, like=0, dislike=0, title=title, annotation='',
                                   contest=contest)
        Page.objects.createPage(work=work, index=1, edition=1, title=page_title, text=text)
        WorkComments.objects.createWorkComments(work, 1)
        WorkRels.objects.create(work=work)
        return work




class CommentManager(models.Manager):
    """ Менеджер создания нового комментария """
    
    
    def create_comment(self, author, text, root=None, title=''):
        """ Создать комментарий """
        comment = self.create(author=author, root=root, title=title, text=text,
                              date=datetime.datetime.now())
        return comment




class VisitManager(models.Manager):
    """ Менеджер создания нового визита """
    
    
    def create_visit(self, visitor):
        """ Создать новый визит """
        visit = self.create(visitor=visitor, time=datetime.datetime.now())
        return visit




class WorkCommentsManager(models.Manager):
    """ Менеджер создания комментариев к произведению """
    
    
    def createWorkComments(self, work, edition):
        """ Создать комментарий """
        comment = Comment.objects.create_comment(author=work.author, text='', title=work.title)
        work_comments = WorkComments.objects.create(work=work, edition=edition, comments=comment)
        return work_comments




class PageManager(models.Manager):
    """ Менеджер создания новых глав """


    def createPage(self, work, index, edition, title='', text=''):
        """ Создать новую главу """
        page = Page.objects.create(work=work, index=index, edition=edition,
                                   title=title, text=text)
        return page




class Comment(models.Model):
    """ Комментарий """
    author = models.ForeignKey(User, verbose_name=u'Автор', related_name='comment_author')
    root = models.ForeignKey('self', verbose_name=u'Корневой элемент', blank=True, null=True, related_name='comment_root')
    title = models.CharField(max_length=127, blank=True, null=True, verbose_name=u'Заголовок')
    text = models.TextField(blank=True, null=True, verbose_name=u'Текст')
    date = models.DateTimeField(verbose_name=u'Дата')
    
    objects = CommentManager()
    
    
    class Meta:
        verbose_name = u'Комментарий'
        verbose_name_plural = u'Комментарии'
    
    
    def __unicode__(self):
        """ Имя поля в админке """
        if self.title and len(self.title) > 0:
            return self.title
        return u'comment'




class Work(models.Model):
    """ Произведение """
    
    
    WORK_STATUS = ((u'draft', u'Черновик'), (u'opened', u'Открытый доступ'), (u'closed', u'Закрытый доступ'))
    WORK_STATUS_PUB = ((u'opened', u'Открытый доступ'), (u'closed', u'Закрытый доступ'))
    
    author = models.ForeignKey(User, verbose_name=u'Автор', related_name='work_author')
    owner = models.ForeignKey(User, blank=True, null=True, verbose_name=u'Владелец', related_name='work_owner')
    fosterling = models.ForeignKey('self', blank=True, null=True, verbose_name=u'Рецензируемая работа', related_name='work_fosterling')
    contest = models.ForeignKey(Contest, blank=True, null=True, verbose_name=u'Конкурс', related_name='work_contest')
    signature = models.CharField(max_length=30, blank=True, null=True, verbose_name=u'Подпись')
    date = models.DateTimeField(blank=True, null=True, verbose_name=u'Дата завершения')
    genre = models.ForeignKey(Genre, blank=True, null=True, verbose_name=u'Жанр', related_name='work_genre')
    status = models.CharField(max_length=6, choices=WORK_STATUS, default=u'draft', verbose_name=u'Статус')
    edition = models.IntegerField(default=1, verbose_name=u'Номер редакции')
    price = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name=u'Цена за права')
    view_price = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name=u'Цена за ознакомление')
    like = models.IntegerField(default=0, verbose_name=u'Количество лайков')
    dislike = models.IntegerField(default=0, verbose_name=u'Количество дизлайков')
    title = models.CharField(max_length=127, verbose_name=u'Название')
    annotation = models.TextField(blank=True, null=True, verbose_name=u'Аннотация')
    
    objects = WorkManager()
    
    
    class Meta:
        verbose_name = u'Работа'
        verbose_name_plural = u'Работы'
    
    
    def __unicode__(self):
        """ Имя поля в админке """
        if self.title and len(self.title) > 0:
            return self.title
        return u'work'
    
    
    def get(self, field_name, default_value=None):
        """ Возвращает значение поля (для инициализации формы экземпляром модели) """
        try:
            value = getattr(self, field_name)
        except AttributeError:
            value = default_value
        return value




class Visitor(models.Model):
    """ Уникальный посетитель произведения """
    user = models.ForeignKey(User, verbose_name=u'Посетитель', related_name='visitor_user')
    work = models.ForeignKey(Work, verbose_name=u'Произведение', related_name='visitor_work')
    
    
    class Meta:
        verbose_name = u'Посетитель'
        verbose_name_plural = u'Посетители'
    
    
    def __unicode__(self):
        """ Имя поля в админке """
        return self.user.username




class Visit(models.Model):
    """ Посещение произведения """
    visitor = models.ForeignKey(Visitor, verbose_name=u'Посетитель')
    time = models.DateTimeField(verbose_name=u'Время посещения')
    
    objects = VisitManager()
    
    
    class Meta:
        verbose_name = u'Визит'
        verbose_name_plural = u'Визиты'
    
    
    def __unicode__(self):
        """ Имя поля в админке """
        return self.time.strftime('%d.%m.%Y [%H:%M:%S]')




class Page(models.Model):
    """ Страница """
    work = models.ForeignKey(Work, verbose_name=u'Произведение', related_name='page_work')
    index = models.IntegerField(verbose_name=u'Номер страницы')
    edition = models.IntegerField(verbose_name=u'Номер редакции')
    title = models.CharField(max_length=127, blank=True, null=True, verbose_name=u'Заголовок')
    text = models.TextField(blank=True, null=True, verbose_name=u'Текст')
    
    objects = PageManager()
    
    
    class Meta:
        verbose_name = u'Глава'
        verbose_name_plural = u'Главы'
    
    
    def __unicode__(self):
        """ Имя поля в админке """
        if self.title and len(self.title) > 0:
            return u'%s (%s) - ред. %d' % (self.title, self.work.title or u'work', self.edition)
        return u'%s - ред. %d' % (self.work.title or u'work', self.edition)
    
    
    def clone(self, index=0, edition=0, title=None):
        """ Функция дублирования главы произведения """
        new_page = Page.objects.createPage(work=self.work, index=index or self.index,
                                           edition=edition or self.edition, title=title or self.title,
                                           text=self.text)
        return new_page




class WorkComments(models.Model):
    """ Комментарии к редакции произведения """
    work = models.ForeignKey(Work, verbose_name=u'Произведение', related_name='work_comments_work')
    edition = models.IntegerField(verbose_name=u'Номер редакции')
    comments = models.OneToOneField(Comment, verbose_name=u'Комментарии', related_name='work_comments')
    
    objects = WorkCommentsManager()
    
    
    class Meta:
        verbose_name = u'Комментарии к произведению'
        verbose_name_plural = u'Комментарии к произведению'
    
    
    def __unicode__(self):
        """ Имя поля в админке """
        return self.work.title or u'comments'





class Maecenas(models.Model):
    """ Пользователь, заплативший за произведение """
    user = models.ForeignKey(User, verbose_name=u'Меценат', related_name='maecenas_user')
    work = models.ForeignKey(Work, verbose_name=u'Произведение', related_name='maecenas_work')
    cash_amount = models.DecimalField(max_digits=10, decimal_places=2, verbose_name=u'Уплаченная сумма')
    
    
    class Meta:
        verbose_name = u'Меценат'
        verbose_name_plural = u'Меценаты'
    
    
    def __unicode__(self):
        """ Имя поля в админке """
        return self.work.title or u'work'




class WorkRels(models.Model):
    """ Списки пользователей, имеющих отношение к произведению """
    work = models.OneToOneField(Work, verbose_name=u'Произведение', related_name='rel_work', primary_key=True)
    coauthors = models.ManyToManyField(User, blank=True, null=True, verbose_name=u'Соавторы', related_name='rel_coauthors')
    trustee = models.ManyToManyField(User, blank=True, null=True, verbose_name=u'Доверенные лица', related_name='rel_trustee')
    viewers = models.ManyToManyField(User, blank=True, null=True, verbose_name=u'Заплатившие за просмотр', related_name='rel_viewers')
    likers = models.ManyToManyField(User, blank=True, null=True, verbose_name=u'Довольные читатели', related_name='rel_likers')
    dislikers = models.ManyToManyField(User, blank=True, null=True, verbose_name=u'Недовольные читатели', related_name='rel_dislikers')
    banned = models.ManyToManyField(User, blank=True, null=True, verbose_name=u'Забаненные читатели', related_name='rel_banned')
    
    
    class Meta:
        verbose_name = u'Комьюнити'
        verbose_name_plural = u'Комьюнити'
    
    
    def __unicode__(self):
        """ Имя поля в админке """
        return self.work.title or u'work'
